C/C++中static的作用(修饰局部变量、修饰全局变量、修饰函数) 您所在的位置:网站首页 CC++ 中 static 的用法全局变量与局部变量 菜鸟教程 C/C++中static的作用(修饰局部变量、修饰全局变量、修饰函数)

C/C++中static的作用(修饰局部变量、修饰全局变量、修饰函数)

2023-08-11 10:32| 来源: 网络整理| 查看: 265

一、static修饰局部变量

         局部变量的作用范围为定义该局部变量的代码块或函数范围内有效,局部变量的生命周期随着函数的调用而创建,并且随着函数调用结束而销毁。static修饰的局部变量的作用域并不会改变,只是生命周期会随着整个程序运行结束而结束。

局部变量和静态局部变量的区别:

         使用static修饰局部变量的方法:在局部变量前面加static关键字,例如:static int a; 经过static修饰的局部变量称为静态局部变量,未经static修饰的局部变量称为动态局部变量。

         局部变量初始化:未经初始化的静态局部变量编译器会自动初始化为0,而未经初始化的动态局部变量编译器会自动初始化为随机值。

         存储的位置:局部变量的生命周期会随着函数的调用被创建,函数的调用入栈,因此动态局部变量存在于栈中;为了改变变量的生命周期,使得变量在函数调用完出栈后变量依然存在可以被使用,将static修饰的静态局部变量存储在静态区中,全局变量和静态变量是存储在一起的;初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统自动释放。

         引入静态局部变量的原因:通常再函数体内定义了一个变量,每当程序运行到改函数时候就会给局部变量分配栈内存,但随着程序退出函数体,系统就会收回栈内存,局部变量也响应的失效。但是有的时候我们需要在两次调用之间对变量的值进项保存。通常的想法是定义一个全局变量来实现。但是这样一来,变量就已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便利。静态局部变量正好解决了这个问题,静态局部变量保存在全局数据区(静态存储区),而不是保存在栈中,每次的值保持到下一次调用,直到下一次赋新值。

         静态变量的作用域:具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在。(当定义他的函数或者语句块结束的时候,作用域结束,但是当局部静态变量离开作用域后,并没有被销毁,而是仍然驻留在内存当中,只不过我们不能再对他进行访问,直到该函数再次被调用,并且值不变)

        总结:静态局部变量值初始化一次;若不赋初值,在初始化的时候会自动赋值为0;只对定义自己的函数体始终可见;把局部变量改变为静态变量是改变了他的存储方式即改变了他的生存周期。

二、static修饰全局变量

         全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。     全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的(在其他源文件中使用时加上extern关键字重新声明即可)。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。      static全局变量只初使化一次,防止在其他文件单元中被引用(在其他源文件中是能使用不能重新对该全局变量进行赋值等操作);  

         使用方法:在全局变量前面加static关键字,例如:static int i = 0;

         初始化:未经初始化的全局变量会被自动初始化为0(自动对象的值是任意的,除非他被显示初始化);

         存储的位置:静态存储区 (static) ,全局变量和静态变量是存储在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统自动释放。

         变量的作用域:具有全局作用域,只初始化一次,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。(使得作用域仅限于被定义的文件中 即,从变量定义到本文件结尾处,其他文件不论通过什么方式都不能访问)。

         总结:静态全局变量值初始化一次;若不赋初值,在初始化的时候会自动赋值为0;只作用于定义他的文件中,不能作用于其他的文件中;把全局变量改变为静态变量是改变了他作用域。

三、static修饰函数

         static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.   static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有